package com.liziba.trend;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.NetUtil;
import cn.hutool.core.util.NumberUtil;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

import java.util.Arrays;
import java.util.Scanner;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * @program: trend
 * @description: 模拟回测服务启动类
 * @author: liziba
 * @date: 2021-02-03 12:02
 */

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
// 启动feign方式调用
@EnableFeignClients
public class TrendTradingBackTestServiceApplication {

    public static void main(String[] args) {
        int port = 8051;
//        int defaultPort = 8051;
//        int eurekaServerPort = 8761;
//
//        // 判断eureka是否启动
//        if(NetUtil.isUsableLocalPort(eurekaServerPort)) {
//            System.err.printf("检查到eurekaServerPort端口%d未启动，本地服务无法注册，强制退出！", eurekaServerPort);
//            System.exit(1);
//        }
//
//        // 启动携带端口号参数
//        if(null != args && args.length > 0) {
//            String p = Arrays.asList(args).stream().filter(arg -> (arg.startsWith("port="))).findFirst().get();
//            port = NumberUtil.isNumber(p) ? Convert.toInt(p) : 0;
//        }
//        // 端口为0则控制台输入
//        if(0 == port) {
//            // 监听5秒并获取控制台输入的端口
//            Future<Integer> portFuture = ThreadUtil.execAsync(() -> {
//                int p = 0;
//                System.out.printf("请5秒内输入启动端口号，推荐 %d，超过5秒后将使用默认端口 %d %n", defaultPort, defaultPort);
//                Scanner scanner = new Scanner(System.in);
//                while (true) {
//                    String nextPort = scanner.nextLine();
//                    if (!NumberUtil.isInteger(nextPort)) {
//                        System.err.println("端口号必须是数字！");
//                        continue;
//                    } else {
//                        p = Convert.toInt(nextPort);
//                        scanner.close();
//                        break;
//                    }
//                }
//                return p;
//            });
//            // 5秒内获取端口，超时取默认端口
//            try {
//                port = portFuture.get(5, TimeUnit.SECONDS);
//            } catch (InterruptedException | ExecutionException | TimeoutException e) {
//                port = defaultPort;
//            }
//            // 判断输入端口是否占用
//            if(!NetUtil.isUsableLocalPort(port)) {
//                System.err.printf("端口%d被占用，无法启动%n", port);
//                System.exit(1);
//            }
            // 启动
            new SpringApplicationBuilder(TrendTradingBackTestServiceApplication.class).properties("server.port=" + port).run(args);
//        }
    }
}
